1. Load Data This markdown file contains the scRNA-seq analysis for the paper titled Integrated protein and transcriptome high-throughput spatial profiling. The data used for this analysis can be found under the GEO repository GSE198353.
# install Seurat v3.0.0
if (!requireNamespace("Seurat", quietly = TRUE) | utils::packageVersion("Seurat") < "4.0.0")
  remotes::install_version("Seurat", version = "4.0.0")

# load data
library(Seurat)
# replicate 1
rep_1_data <- Read10X_h5('spleen_rep_1_filtered_feature_bc_matrix.h5')
rep_1_image <- Read10X_Image('GSE198353_spleen_replicate_1_spatial')
rep_1 <- CreateSeuratObject(rep_1_data$`Gene Expression`, assay = "RNA", project = "Rep_1")
rep_1_CITE <- CreateSeuratObject(rep_1_data$`Antibody Capture`, assay = "CITE", project = "Rep_1")
rep_1@assays$CITE <- rep_1_CITE@assays$CITE
rep_1$nCount_CITE <- rep_1_CITE$nCount_CITE
rep_1$nFeature_CITE <- rep_1_CITE$nFeature_CITE
rep_1_image@assay <- c("RNA", "CITE")
rep_1_image@key <- "Rep_1"
rep_1@images <- list(Rep_1 = rep_1_image)
# replicate 2
rep_2_data <- Read10X_h5('spleen_rep_2_filtered_feature_bc_matrix.h5')
rep_2_image <- Read10X_Image('GSE198353_spleen_replicate_2_spatial')
rep_2 <- CreateSeuratObject(rep_2_data$`Gene Expression`, assay = "RNA", project = "Rep_2")
rep_2_CITE <- CreateSeuratObject(rep_2_data$`Antibody Capture`, assay = "CITE", project = "Rep_2")
rep_2@assays$CITE <- rep_2_CITE@assays$CITE
rep_2$nCount_CITE <- rep_2_CITE$nCount_CITE
rep_2$nFeature_CITE <- rep_2_CITE$nFeature_CITE
rep_2_image@assay <- c("RNA", "CITE")
rep_2_image@key <- "Rep_2"
rep_2@images <- list(Rep_2 = rep_2_image)
# merge 
spleen <- merge(rep_1, rep_2, add.cell.ids = c("Rep_1", "Rep_2"), project = "Spleen")
SpatialDimPlot(spleen, images = c("Rep_1", "Rep_2"))

  1. Data normalization
DefaultAssay(spleen) = "CITE"
spleen = NormalizeData(spleen, assay = "RNA", verbose = FALSE)
spleen = NormalizeData(spleen, normalization.method = "CLR", assay = "CITE", margin = 2, verbose = FALSE)
spleen <- ScaleData(spleen, verbose = FALSE)
p1 <- SpatialFeaturePlot(spleen,features = c("CD3","CD4","CD8",
                                             "CD19","B220-CD45R","IgD",
                                             "F4-80", "CD163", "CD68"), ncol = 3, images = c("Rep_1"))
p2 <- SpatialFeaturePlot(spleen,features = c("CD3","CD4","CD8",
                                             "CD19","B220-CD45R","IgD",
                                             "F4-80", "CD163", "CD68"), ncol = 3, images = c("Rep_2"))
p1 - p2

  1. Dimensionality Reduction and Clustering
spleen <- RunPCA(spleen, features = rownames(spleen))
spleen <- FindNeighbors(spleen, dims = 1:10)
spleen <- FindClusters(spleen, resolution = 0.2, verbose = FALSE)
SpatialDimPlot(spleen, images = c("Rep_1","Rep_2"))

# Cluster 4 represents low-quality spatial barcodes
# Cluster 3 represents epithelial enriched tissue borders
VlnPlot(spleen, c("nCount_CITE", "nFeature_CITE", "EpCAM"))

# rename clusters
spleen <- subset(spleen, subset = CITE_snn_res.0.2 %in% c(3,4), invert = TRUE)
spleen <- RenameIdents(spleen, '0' = "Macrophage-enriched", '1' = "B cell-enriched", '2' = "T cell-enriched")
SpatialDimPlot(spleen, images = c("Rep_1","Rep_2"))

  1. Differentially expressed ADTs
adt.markers <- FindAllMarkers(spleen, only.pos = TRUE, logfc.threshold = 0.2, verbose = FALSE)
DoHeatmap(spleen, adt.markers$gene, assay = "CITE", angle = 45)

  1. Differentially expressed mRNAs
DefaultAssay(spleen) = "RNA"
mrna.markers <- FindAllMarkers(spleen, only.pos = TRUE, verbose = FALSE)
spleen.avg <- AverageExpression(spleen, assays = "RNA", return.seurat = TRUE)
DoHeatmap(spleen.avg, mrna.markers$gene, draw.lines = FALSE, assay = "RNA", angle = 45)

  1. Session info
# Session info
print(sessionInfo())
## R version 4.0.3 (2020-10-10)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Big Sur 10.16
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] SeuratObject_4.0.0 Seurat_4.0.1      
## 
## loaded via a namespace (and not attached):
##   [1] nlme_3.1-151          spatstat.sparse_2.0-0 matrixStats_0.57.0    bit64_4.0.5           RcppAnnoy_0.0.18      RColorBrewer_1.1-2   
##   [7] httr_1.4.2            sctransform_0.3.2     tools_4.0.3           R6_2.5.0              irlba_2.3.3           rpart_4.1-15         
##  [13] KernSmooth_2.23-18    uwot_0.1.10           mgcv_1.8-33           DBI_1.1.0             lazyeval_0.2.2        colorspace_2.0-0     
##  [19] withr_2.4.3           tidyselect_1.1.0      gridExtra_2.3         bit_4.0.4             compiler_4.0.3        hdf5r_1.3.5          
##  [25] plotly_4.9.2.2        labeling_0.4.2        scales_1.1.1          lmtest_0.9-38         spatstat.data_1.7-0   ggridges_0.5.3       
##  [31] pbapply_1.4-3         goftest_1.2-2         stringr_1.4.0         digest_0.6.27         spatstat.utils_2.1-0  rmarkdown_2.6        
##  [37] pkgconfig_2.0.3       htmltools_0.5.2       parallelly_1.23.0     limma_3.46.0          fastmap_1.1.0         htmlwidgets_1.5.3    
##  [43] rlang_0.4.10          shiny_1.5.0           farver_2.0.3          generics_0.1.0        zoo_1.8-8             jsonlite_1.7.2       
##  [49] ica_1.0-2             dplyr_1.0.2           magrittr_2.0.1        patchwork_1.1.1       Matrix_1.3-2          Rcpp_1.0.7           
##  [55] munsell_0.5.0         abind_1.4-5           reticulate_1.18       lifecycle_0.2.0       stringi_1.5.3         yaml_2.2.1           
##  [61] MASS_7.3-53           Rtsne_0.15            plyr_1.8.6            grid_4.0.3            parallel_4.0.3        listenv_0.8.0        
##  [67] promises_1.1.1        ggrepel_0.9.0         crayon_1.3.4          deldir_0.2-3          miniUI_0.1.1.1        lattice_0.20-41      
##  [73] cowplot_1.1.1         splines_4.0.3         tensor_1.5            knitr_1.30            pillar_1.4.7          igraph_1.2.6         
##  [79] spatstat.geom_1.65-5  future.apply_1.7.0    reshape2_1.4.4        codetools_0.2-18      leiden_0.3.6          glue_1.4.2           
##  [85] evaluate_0.14         data.table_1.13.6     vctrs_0.3.6           png_0.1-7             httpuv_1.5.4          polyclip_1.10-0      
##  [91] gtable_0.3.0          RANN_2.6.1            purrr_0.3.4           spatstat.core_1.65-5  tidyr_1.1.2           scattermore_0.7      
##  [97] future_1.21.0         ggplot2_3.3.3         xfun_0.20             mime_0.9              xtable_1.8-4          later_1.1.0.1        
## [103] survival_3.2-7        viridisLite_0.3.0     tibble_3.0.4          cluster_2.1.0         globals_0.14.0        fitdistrplus_1.1-3   
## [109] ellipsis_0.3.1        ROCR_1.0-11

  1. Tri-Institutional Training Program in Computational Biology and Medicine, xin2001@med.cornell.edu